package com.kaguya.adapter;

/**
 * 适配器模式 结构型 将一个类的接口, 转换成客户期望的另一个接口。 适配器让原本接口不兼容的类可以合作无间。 对象适配器使用组合, 类适配器使用多重继承。
 */
public class Adapter {
    public static void main(String[] args) {
        SystemA systemA = new SystemAImpl();

        SystemB systemB = new InterfaceAdapter(systemA);
        systemB.run();
    }
}

/**
 * 例子：a想与b进行接口对接，但是a系统比较老旧，已经对外开放了个相同功能的方法叫exec，但是b系统与a系统对接的文档是run，那想要适配a系统的exec方法，就需要一个适配器
 */
interface SystemA {
    void exec();
}
interface SystemB {
    void run();
}
class SystemAImpl implements SystemA{

    @Override
    public void exec() {
        System.out.println("SystemA.exec");
    }
}
class SystemBImpl implements SystemB{

    @Override
    public void run() {
        System.out.println("SystemB.run");
    }
}

/**
 * 适配器，最终通过适配器的run方法来调用A的exec方法
 */
class InterfaceAdapter implements SystemB{
    SystemA sysA;
    SystemB sysB;

    /**
     * 通过new 适配器，并传入SystemA，赋值后调用run方法完成适配
     * @param sysA
     */
    public InterfaceAdapter(SystemA sysA) {
        this.sysA = sysA;
    }

    @Override
    public void run() {
        sysA.exec();
    }
}